import os
import sys
import serial.tools.list_ports
from typing import List, Optional

class Utils:
    @staticmethod
    def get_config_file_path(config_name: str) -> str:
        """获取配置文件路径"""
        configs_dir = Utils.get_configs_dir()
        print(f"[调试] 获取配置文件路径: {configs_dir}")
        return os.path.join(configs_dir, config_name)
    
    @staticmethod
    def get_root_dir() -> str:
        """获取项目根目录"""
        # 检测是否在PyInstaller打包环境中运行
        if getattr(sys, 'frozen', False):
            # 在打包环境中，使用exe文件所在目录
            root_dir = os.path.dirname(sys.executable)
            print(f"[调试] 打包环境 - 获取项目根目录: {root_dir}")
        else:
            # 在开发环境中，使用相对路径
            root_dir = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
            print(f"[调试] 开发环境 - 获取项目根目录: {root_dir}")
        return root_dir
    
    @staticmethod
    def get_configs_dir() -> str:
        """获取配置文件目录"""
        return os.path.join(Utils.get_root_dir(), "configs")
    
    @staticmethod
    def get_logs_dir() -> str:
        """获取日志文件目录"""
        return os.path.join(Utils.get_root_dir(), "logs")
    
    @staticmethod
    def get_data_dir() -> str:
        """获取数据文件目录"""
        return os.path.join(Utils.get_root_dir(), "data")
    
    @staticmethod
    def get_images_dir() -> str:
        """获取图片文件目录"""
        return os.path.join(Utils.get_root_dir(), "images")
    
    @staticmethod
    def get_icon_path(icon_name: str = "logo.png") -> str:
        """获取图标文件路径
        
        Args:
            icon_name: 图标文件名，默认为 "logo.png"
            
        Returns:
            str: 图标文件的完整路径，如果找不到则返回空字符串
        """
        # 获取图标文件路径
        root_dir = Utils.get_root_dir()
        icon_path = os.path.join(root_dir, "images", icon_name)
        
        if os.path.exists(icon_path):
            return icon_path
        
        # 如果默认路径不存在，尝试相对路径
        alternative_paths = [
            os.path.join(os.getcwd(), "images", icon_name),
            os.path.join(os.path.dirname(sys.executable), "images", icon_name),
            f"images/{icon_name}",
            icon_name
        ]
        
        for path in alternative_paths:
            if os.path.exists(path):
                return path
        
        return ""
    
    @staticmethod
    def get_available_ports() -> list:
        """获取可用的串口列表"""
        ports = [port.device for port in serial.tools.list_ports.comports()]
        return ports
    
    
class Data_Utils:
    @staticmethod
    def list_str_to_list(str_list: List[str]) -> Optional[list[int]]:
        """将十六进制字符串列表转换为bytes"""
        try:
            # 如果是 ["01", "03", "00", "00"] 格式
            return [int(s, 16) for s in str_list]
        except ValueError as e:
            return None